package br.com.itc.componentes
{
	import flash.display.DisplayObject;
	
	import mx.core.Application;
	import mx.managers.CursorManager;
	import mx.managers.IFocusManagerContainer;
	import mx.managers.PopUpManager;
	import mx.managers.PopUpManagerChildList;
	import mx.managers.ToolTipManager;
	
	//Classe a ser utilizada para exibição do bloqueio
	public class MostraCursor
	{
		private static var mostraCursor:MostraCursor; //instancia classe para chamada estática
		public static var bloqueio:bloqueiaTela; //armazena bloqueio gerado
		
		//tipos de bloqueio
		public static const CURSOR_GRAVAR:int = 1;
		public static const CURSOR_EXCLUIR:int = 2;
		public static const CURSOR_PESQUISAR:int = 3;
		public static const CURSOR_PROGRESSO:int = 4;
		
		public static const assistentePlataforma:Boolean = false;
		
		//construtor
		public function MostraCursor():void{
		}
		
		//inicia bloqueio
		public static function setBusyCursor(msg:String, objParent:Object, tipoEspera:int=0):void{
			ToolTipManager.enabled = true;
			
			if(bloqueio == null){ //caso não exista um bloqueio inicia um
				mostraCursor = new MostraCursor(); //cria instância
							
				bloqueio = bloqueiaTela(PopUpManager.createPopUp(DisplayObject(objParent), bloqueiaTela, true, PopUpManagerChildList.POPUP)); //cria bloqueio
				bloqueio.addEventListener("terminei", removeCursor);				//listener para remover bloqueio
				
				PopUpManager.centerPopUp(bloqueio);									//centraliza
				
				bloqueio.txtMensagem.text = msg.toUpperCase();						//mensagem a ser exibida
				bloqueio.setIconeEspera(tipoEspera);								//define tipo de bloqueio
					
				CursorManager.setBusyCursor();
				
			}
		}		
		
		public static function setaProgresso(valorTotal:Number, valorAtual:Number):void{
			if(valorAtual && valorTotal && bloqueio)
			{
				bloqueio.pbProgresso.setProgress(valorAtual, valorTotal);
			}
		}
		
		//remove bloqueio efetivamente
		private static function removeCursor(evt:Object):void{
			CursorManager.removeBusyCursor();   //remove cursor de ocupado padrão do Flex
			PopUpManager.removePopUp(bloqueio); //remove bloqueio
			
			ToolTipManager.enabled = false;
			
			if(bloqueio.systemManager.numModalWindows > 0)
			{
				for(var i:int = bloqueio.systemManager.popUpChildren.numChildren; i >= 0; i--)
				{
					var itm:Object = bloqueio.systemManager.popUpChildren.getChildAt(i);
					if(itm as IFocusManagerContainer)
					{
						bloqueio.systemManager.activate(itm as IFocusManagerContainer);
						bloqueio.focusManager.showFocus();
						break;
					}
				}
				
				bloqueio = null; //mata instância do bloqueio
				
				return;
			}
			
			if(bloqueio.systemManager.popUpChildren.numChildren<=1)
			{
				bloqueio.systemManager.activate(Application.application as IFocusManagerContainer);
				bloqueio.focusManager.showFocus();
			}
			else
			{
				for(var j:int = bloqueio.systemManager.popUpChildren.numChildren; j>=0; j--)
				{
					var itm2:Object = bloqueio.systemManager.popUpChildren.getChildAt(j);
					if(itm2 as IFocusManagerContainer)
					{
						bloqueio.systemManager.activate(itm2 as IFocusManagerContainer);
						bloqueio.focusManager.showFocus();
						break;
					}
				}
			}
			
			bloqueio = null; //mata instância do bloqueio
		}
		
		public static function removeBusyCursor():void{
			if(bloqueio != null) //previne inconsistências ao finalizar bloqueio
				bloqueio.removePopUp()
		}	
	}
}